package chapter8;

/**
 * “之”字形打印矩阵
 * 每次循环打印一斜行，要么从右上到左下打印，要么从左下到右上打印
 * (tR,tC)代表斜线的右上端点，(dR,dC)代表斜线的左下端点
 */
public class PrintMatrixZigZag {
    /**
     * “之”字形打印矩阵
     * @param matrix
     */
    public static void printMatrixZigZag(int[][] matrix) {
        int tR = 0;
        int tC = 0;
        int dR = 0;
        int dC = 0;
        int endR = matrix.length - 1;
        int endC = matrix[0].length - 1;
        boolean fromUp = false;
        while (tR != endR + 1) {
            printLevel(matrix, tR, tC, dR, dC, fromUp);
            tR = tC == endC ? tR + 1 : tR; // tC是最后一列时，行数tR+1
            tC = tC == endC ? tC : tC + 1; // tC不是最后一列时，列数tC+1
            dC = dR == endR ? dC + 1 : dC; // dR是最后一行时，列数dC+1
            dR = dR == endR ? dR : dR + 1; // dR不是最后一行时，行数dR+1
            fromUp = !fromUp;
        }
        System.out.println();
    }

    /**
     * 打印矩阵倾斜线上的所有元素
     * @param matrix
     * @param tR 右端点的行坐标
     * @param tC 右端点的列坐标
     * @param dR 左端点的行坐标
     * @param dC 左端点的列坐标
     * @param fromUp 打印方向，true从右上到左下
     */
    private static void printLevel(int[][] matrix, int tR, int tC, int dR, int dC, boolean fromUp) {
        if (fromUp) {
            while (tR != dR + 1) {
                System.out.print(matrix[tR++][tC--] + " ");
            }
        } else {
            while (dR != tR - 1) {
                System.out.print(matrix[dR--][dC++] + " ");
            }
        }
    }
}
